#include "DataParser.h"

DRAGONBONES_NAMESPACE_BEGIN

const char* DataParser::DATA_VERSION_2_3 = "2.3";
const char* DataParser::DATA_VERSION_3_0 = "3.0";
const char* DataParser::DATA_VERSION_4_0 = "4.0";
const char* DataParser::DATA_VERSION_4_5 = "4.5";
const char* DataParser::DATA_VERSION_5_0 = "5.0";
const char* DataParser::DATA_VERSION_5_5 = "5.5";
const char* DataParser::DATA_VERSION     = DataParser::DATA_VERSION_5_5;

const std::vector<std::string> DataParser::DATA_VERSIONS{DataParser::DATA_VERSION_4_0, DataParser::DATA_VERSION_4_5,
                                                         DataParser::DATA_VERSION_5_0, DataParser::DATA_VERSION_5_5};

const char* DataParser::TEXTURE_ATLAS = "TextureAtlas";
const char* DataParser::SUB_TEXTURE   = "SubTexture";
const char* DataParser::FORMAT        = "format";
const char* DataParser::IMAGE_PATH    = "imagePath";
const char* DataParser::WIDTH         = "width";
const char* DataParser::HEIGHT        = "height";
const char* DataParser::ROTATED       = "rotated";
const char* DataParser::FRAME_X       = "frameX";
const char* DataParser::FRAME_Y       = "frameY";
const char* DataParser::FRAME_WIDTH   = "frameWidth";
const char* DataParser::FRAME_HEIGHT  = "frameHeight";

const char* DataParser::DRADON_BONES    = "dragonBones";
const char* DataParser::USER_DATA       = "userData";
const char* DataParser::ARMATURE        = "armature";
const char* DataParser::BONE            = "bone";
const char* DataParser::SLOT            = "slot";
const char* DataParser::CONSTRAINT      = "constraint";
const char* DataParser::IK              = "ik";
const char* DataParser::SKIN            = "skin";
const char* DataParser::DISPLAY         = "display";
const char* DataParser::ANIMATION       = "animation";
const char* DataParser::Z_ORDER         = "zOrder";
const char* DataParser::FFD             = "ffd";
const char* DataParser::FRAME           = "frame";
const char* DataParser::TRANSLATE_FRAME = "translateFrame";
const char* DataParser::ROTATE_FRAME    = "rotateFrame";
const char* DataParser::SCALE_FRAME     = "scaleFrame";
const char* DataParser::DISPLAY_FRAME   = "displayFrame";
const char* DataParser::COLOR_FRAME     = "colorFrame";
const char* DataParser::DEFAULT_ACTIONS = "defaultActions";
const char* DataParser::ACTIONS         = "actions";
const char* DataParser::EVENTS          = "events";
const char* DataParser::INTS            = "ints";
const char* DataParser::FLOATS          = "floats";
const char* DataParser::STRINGS         = "strings";
const char* DataParser::CANVAS          = "canvas";

const char* DataParser::TRANSFORM = "transform";
const char* DataParser::PIVOT     = "pivot";
const char* DataParser::AABB      = "aabb";
const char* DataParser::COLOR     = "color";

const char* DataParser::VERSION             = "version";
const char* DataParser::COMPATIBLE_VERSION  = "compatibleVersion";
const char* DataParser::FRAME_RATE          = "frameRate";
const char* DataParser::TYPE                = "type";
const char* DataParser::SUB_TYPE            = "subType";
const char* DataParser::NAME                = "name";
const char* DataParser::PARENT              = "parent";
const char* DataParser::TARGET              = "target";
const char* DataParser::STAGE               = "stage";
const char* DataParser::SHARE               = "share";
const char* DataParser::PATH                = "path";
const char* DataParser::LENGTH              = "length";
const char* DataParser::DISPLAY_INDEX       = "displayIndex";
const char* DataParser::BLEND_MODE          = "blendMode";
const char* DataParser::INHERIT_TRANSLATION = "inheritTranslation";
const char* DataParser::INHERIT_ROTATION    = "inheritRotation";
const char* DataParser::INHERIT_SCALE       = "inheritScale";
const char* DataParser::INHERIT_REFLECTION  = "inheritReflection";
const char* DataParser::INHERIT_ANIMATION   = "inheritAnimation";
const char* DataParser::INHERIT_DEFORM      = "inheritDeform";
const char* DataParser::BEND_POSITIVE       = "bendPositive";
const char* DataParser::CHAIN               = "chain";
const char* DataParser::WEIGHT              = "weight";

const char* DataParser::FADE_IN_TIME = "fadeInTime";
const char* DataParser::PLAY_TIMES   = "playTimes";
const char* DataParser::SCALE        = "scale";
const char* DataParser::OFFSET       = "offset";
const char* DataParser::POSITION     = "position";
const char* DataParser::DURATION     = "duration";
const char* DataParser::TWEEN_EASING = "tweenEasing";
const char* DataParser::TWEEN_ROTATE = "tweenRotate";
const char* DataParser::TWEEN_SCALE  = "tweenScale";
const char* DataParser::CLOCK_WISE   = "clockwise";
const char* DataParser::CURVE        = "curve";
const char* DataParser::EVENT        = "event";
const char* DataParser::SOUND        = "sound";
const char* DataParser::ACTION       = "action";

const char* DataParser::X       = "x";
const char* DataParser::Y       = "y";
const char* DataParser::SKEW_X  = "skX";
const char* DataParser::SKEW_Y  = "skY";
const char* DataParser::SCALE_X = "scX";
const char* DataParser::SCALE_Y = "scY";
const char* DataParser::VALUE   = "value";
const char* DataParser::ROTATE  = "rotate";
const char* DataParser::SKEW    = "skew";

const char* DataParser::ALPHA_OFFSET     = "aO";
const char* DataParser::RED_OFFSET       = "rO";
const char* DataParser::GREEN_OFFSET     = "gO";
const char* DataParser::BLUE_OFFSET      = "bO";
const char* DataParser::ALPHA_MULTIPLIER = "aM";
const char* DataParser::RED_MULTIPLIER   = "rM";
const char* DataParser::GREEN_MULTIPLIER = "gM";
const char* DataParser::BLUE_MULTIPLIER  = "bM";

const char* DataParser::UVS       = "uvs";
const char* DataParser::VERTICES  = "vertices";
const char* DataParser::TRIANGLES = "triangles";
const char* DataParser::WEIGHTS   = "weights";
const char* DataParser::SLOT_POSE = "slotPose";
const char* DataParser::BONE_POSE = "bonePose";

const char* DataParser::GOTO_AND_PLAY = "gotoAndPlay";

const char* DataParser::DEFAULT_NAME = "default";

TextureFormat DataParser::_getTextureFormat(std::string_view value)
{
    std::string lower{value};
    std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);

    if (lower == "rgba8888")
    {
        return TextureFormat::RGBA8888;
    }
    else if (lower == "bgra8888")
    {
        return TextureFormat::BGRA8888;
    }
    else if (lower == "rgba4444")
    {
        return TextureFormat::RGBA4444;
    }
    else if (lower == "rgb888")
    {
        return TextureFormat::RGB888;
    }
    else if (lower == "rgb565")
    {
        return TextureFormat::RGB565;
    }
    else if (lower == "rgba5551")
    {
        return TextureFormat::RGBA5551;
    }

    return TextureFormat::DEFAULT;
}

ArmatureType DataParser::_getArmatureType(std::string_view value)
{
    std::string lower{value};
    std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);

    if (lower == "armature")
    {
        return ArmatureType::Armature;
    }
    else if (lower == "movieClip")
    {
        return ArmatureType::MovieClip;
    }
    else if (lower == "stage")
    {
        return ArmatureType::Stage;
    }

    return ArmatureType::Armature;
}

DisplayType DataParser::_getDisplayType(std::string_view value)
{
    std::string lower{value};
    std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);

    if (lower == "image")
    {
        return DisplayType::Image;
    }
    else if (lower == "armature")
    {
        return DisplayType::Armature;
    }
    else if (lower == "mesh")
    {
        return DisplayType::Mesh;
    }
    else if (lower == "boundingbox")
    {
        return DisplayType::BoundingBox;
    }

    return DisplayType::Image;
}

BoundingBoxType DataParser::_getBoundingBoxType(std::string_view value)
{
    std::string lower{value};
    std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);

    if (lower == "rectangle")
    {
        return BoundingBoxType::Rectangle;
    }
    else if (lower == "ellipse")
    {
        return BoundingBoxType::Ellipse;
    }
    else if (lower == "polygon")
    {
        return BoundingBoxType::Polygon;
    }

    return BoundingBoxType::Rectangle;
}

ActionType DataParser::_getActionType(std::string_view value)
{
    std::string lower{value};
    std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);

    if (lower == "play")
    {
        return ActionType::Play;
    }
    else if (lower == "frame")
    {
        return ActionType::Frame;
    }
    else if (lower == "sound")
    {
        return ActionType::Sound;
    }

    return ActionType::Play;
}

BlendMode DataParser::_getBlendMode(std::string_view value)
{
    std::string lower{value};
    std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);

    if (lower == "normal")
    {
        return BlendMode::Normal;
    }
    else if (lower == "add")
    {
        return BlendMode::Add;
    }
    else if (lower == "alpha")
    {
        return BlendMode::Alpha;
    }
    else if (lower == "darken")
    {
        return BlendMode::Darken;
    }
    else if (lower == "difference")
    {
        return BlendMode::Difference;
    }
    else if (lower == "erase")
    {
        return BlendMode::Erase;
    }
    else if (lower == "hardlight")
    {
        return BlendMode::HardLight;
    }
    else if (lower == "invert")
    {
        return BlendMode::Invert;
    }
    else if (lower == "layer")
    {
        return BlendMode::Layer;
    }
    else if (lower == "lighten")
    {
        return BlendMode::Lighten;
    }
    else if (lower == "multiply")
    {
        return BlendMode::Multiply;
    }
    else if (lower == "overlay")
    {
        return BlendMode::Overlay;
    }
    else if (lower == "screen")
    {
        return BlendMode::Screen;
    }
    else if (lower == "subtract")
    {
        return BlendMode::Subtract;
    }

    return BlendMode::Normal;
}

DRAGONBONES_NAMESPACE_END
